home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
fb386
/
tool
/
watanabe
/
menu
/
menu.bas
< prev
next >
Wrap
BASIC Source File
|
1995-01-19
|
22KB
|
564 lines
1000 '*********************************************************************
1010 '* メニュー画面 v0.80c *
1020 '* 1994年12月12日(月) (C)渡辺 良一 *
1030 '*********************************************************************
1040 '
1050 '
1060 '
1070 '
1080 '★変数表(主なもの)
1090 ' 表示$ ・・・・・・ 表示する内容
1100 ' FILE$ ・・・・・・ ファイルの名前
1110 ' FS& ・・・・・・ ファイルのサイズ(EUP演奏時のみ使用)
1120 ' P ・・・・・・ ページ
1130 ' C ・・・・・・ カーソル
1140 ' 演奏 ・・・・・・ EUPファイルをロードする変数
1150 '
1160 '
1170 '
1180 'beep 363523,20,1200
1190 IF FRE(4)<200000 THEN *END
1200 CLEAR,,2048,FRE(4)-100000,6,0
1210 STOP OFF:BGM 1
1220 LOADM"keyclear.rex",0
1230 DEF FONT"システム 16ドット"
1240 ON ERROR GOTO *ERROR
1250 DEFINT A-Z,P,C,項,演,曲,エ,色,変
1260 DIM 題$(7),項目数(7),表示$(7,9,9),FILE$(7,9,9),FS&(9,9),入力$(1)
1270 '↓BASICのバージョンを調べる(Ver1以下だと VER=0)
1280 IF PEEK(&H30D2,4)=&H20312E32 THEN VER=1 'VER 2.1 L10
1290 IF PEEK(&H30DA,4)=&H20312E32 THEN VER=2 'VER 2.1 L10 M
1300 '★★★メニューファイル読み込み★★★
1310 OPEN "I",#1,"menu.dat"
1320 INPUT#1,MS
1330 FOR I=0 TO MS
1340 LINE INPUT#1,題$(I)
1350 INPUT#1,項目数(I)
1360 P=0:項目数=項目数(I)
1370 WHILE 項目数>0
1380 FOR J=0 TO 9
1390 IF (I=0 AND (J<2 OR 7<J OR MS+1<J)) OR (I=1 AND P=0 AND J=0) OR J>=項目数 THEN *NEXT
1400 LINE INPUT#1,表示$(I,P,J)
1410 IF I>0 THEN LINE INPUT#1,FILE$(I-1,P,J) 'メインメニューでないなら
1420 IF I=1 AND (P OR J) THEN INPUT#1,FS&(P,J) 'EUPメニューなら
1430 *NEXT:NEXT J
1440 P=P+1:項目数=項目数-10
1450 WEND
1460 NEXT I:CLOSE #1
1470 '
1480 *環境初期化
1490 エラー=1
1500 SCREEN 0:SCREEN@0
1510 WINDOW(0,0)-(639,479)
1520 VIEW (0,0)-(639,479)
1530 WIDTH 80,25
1540 DEF SPRITE 99,0
1550 '+++++パレット初期化+++++++++++++++++++
1560 FOR P=0 TO 15
1570 READ G,R,B
1580 PALETTE P,[G,R,B]
1590 NEXT
1600 DATA &h00,&h00,&h00, &h00,&h00,&h80, &h00,&h80,&h00, &h00,&h80,&h80
1610 DATA &h80,&h00,&h00, &h80,&h00,&h80, &h80,&h80,&h00, &h80,&h80,&h80
1620 DATA &h40,&h40,&h40, &h00,&H00,&hf0, &h00,&hf0,&h00, &h00,&hf0,&Hf0
1630 'DATA &hf0,&h00,&h00, &hf0,&H00,&hf0, &hf0,&hf0,&h00, &hf0,&hf0,&Hf0
1640 DATA &hd0,&h00,&h00, &hd0,&H00,&hd0, &hf0,&hf0,&h00, &hd0,&hd0,&Hd0
1650 '+++++PFキー初期化++++++++++++++++++
1660 FOR K=1 TO 10
1670 READ K$:KEY K,K$
1680 NEXT
1690 DATA "M","B","S","H","D","R","N","E","Q","P"
1700 CC=1:X=48:Y=128
1710 題$(0)="メインメニュー"
1720 題$(1)="BGMメニュー"
1730 表示$(0,0,0)="このプログラムを終了する。"
1740 表示$(0,0,1)="BGMを選択する。"
1750 表示$(0,0,8)="電源を切断する。"
1760 表示$(0,0,9)="BASICを終了する。"
1770 表示$(1,0,0)="演奏を停止する。"
1780 '********************************************************************
1790 *初期表示
1800 COLOR 7,%12,%15,4:CLS:CONSOLE 0,24,2
1810 LINE(55,108)-(630,379),PSET, %4,BF, %4 '影
1820 LINE(33, 91)-(606,111),PSET, %3,BF, %3 '枠(プログラム名とVER)
1830 LINE(33,112)-(606,360),PSET,%15,BF,%15 '枠(項目)
1840 LINE(32, 90)-(607,361),PSET, %0,B '淵
1850 SYMBOL(160,93),"メニュー画面 Version 0.80c ----- by Ryoichi.w" ,1,1,%15
1860 LINE(560,462)-(640,480),PSET,%0,BF,%6 'かな漢字変換のところ
1870 '+++++PFキー表示+++++++++++++++++++
1880 RESTORE *PFKEY_DATA
1890 FOR I=0 TO 9
1900 XX=I*48+46:IF I>4 THEN XX=XX+20
1910 LINE(XX,462)-STEP(38,20),PSET,%0,BF,%6
1920 READ K$
1930 SYMBOL(XX+4,463),K$,1,1,%15
1940 NEXT
1950 *PFKEY_DATA
1960 DATA "メイン" ,"BGM" ,"記録","編集","削除"
1970 DATA "前頁","次頁","END" ,"終了","POFF"
1980 GOSUB *メッセージ:LOCATE 67,6:PRINT"ページ"
1990 '********************************************************************
2000 '
2010 *表示 'ページだけ移動させるときは、ここを実行しない
2020 色=15:GOSUB *LINE
2030 IF CC THEN C=0:P=0:X=48:Y=152 ELSE CC=1
2040 '↑CC=0 以外でカーソル位置をクリアする
2050 色=13:GOSUB *LINE
2060 COLOR 0,,,4
2070 LOCATE 6,6:PRINT SPC(59)
2080 LOCATE 40-LEN(題$(MN))\2,6:PRINT 題$(MN)
2090 *表示2
2100 COLOR 0,,,4:LOCATE 65,6
2110 PRINT AKCNV$(RIGHT$(STR$(P),1))
2120 GOSUB *表示3
2130 '
2140 *キー入力
2150 K$=INKEY$:IF K$="" THEN *キー入力
2160 '↓エラーメッセージが表示されてればそれ消す
2170 IF EM THEN GOSUB *メッセージ:EM=0:GOSUB *キー入力
2180 CALLM 0
2190 IF K$="M" AND MN>0 THEN MN=0:P=0:GOTO *表示 'PF1
2200 IF K$="B" AND MN<>1 THEN MN=1:GOTO *表示 'PF2
2210 IF K$="S" AND 変更 THEN *セーブ '変更点があれば 'PF3
2220 IF K$="H" THEN *編集 'PF4
2230 IF K$="D" AND 表示$(MN,P,C)<>"" THEN *削除 'PF5
2240 IF K$="R" AND P>0 AND MN>0 THEN P=P-1:GOTO *表示2 'PF6
2250 IF K$="N" AND P<9 AND MN>0 THEN P=P+1:GOTO *表示2 'PF7
2260 IF K$="E" THEN GOSUB *画面クリア:GOTO *END 'PF8
2270 IF K$="Q" THEN GOSUB *画面クリア:SYSTEM 'PF9
2280 IF K$="P" THEN OUT &H22,&H40 '電源OFF 'PF10
2290 '***********************************************
2300 IF K$=CHR$(28) OR K$=CHR$(29) THEN '左右キー
2310 IF C MOD 2=0 THEN C=C+1 ELSE C=C-1
2320 GOTO *カーソル移動
2330 ELSE IF K$=CHR$(30) THEN '上キー
2340 IF C \ 2=0 THEN C=C+8 ELSE C=C-2
2350 GOTO *カーソル移動
2360 ELSE IF K$=CHR$(31) THEN
2370 IF C \ 2=4 THEN C=C-8 ELSE C=C+2 '下キー
2380 GOTO *カーソル移動
2390 ELSE IF K$=CHR$(13) AND 表示$(MN,P,C)<>"" THEN
2400 IF MN=0 THEN *メインメニュー 'この2つ以外は
2410 IF MN=1 THEN *BGM 'プログラムロードへ
2420 ELSE
2430 GOTO *キー入力
2440 ENDIF
2450 '
2460 'プログラムロード
2470 LM$="ロードする":RM$="RUNする"
2480 GOSUB *2択
2490 FILE$=FILE$(MN-1,P,C):DIR$=""
2500 I=KINSTR(FILE$,"\")
2510 WHILE I 'ディレクトリとファイルに分ける
2520 DIR$ =DIR$+KLEFT$(FILE$,I)
2530 FILE$=KMID$(FILE$,I+1)
2540 I=KINSTR(FILE$,"\")
2550 WEND
2560 IF LEN(FILE$)>12 THEN DIR$=".":FILE$="" ELSE IF DIR$="" THEN DIR$="." ELSE DIR$=LEFT$(DIR$,LEN(DIR$)-1)
2570 IF VER THEN GOSUB *ファイル書き込み:GOSUB *ウィンドウ書き込み
2580 IF X=48 THEN *LOAD ELSE *RUN
2590 '
2600 '
2610 '
2620 '******* サブルーチンなど *******************************************
2630 '
2640 *メインメニュー
2650 IF 表示$(MN,P,C)="" THEN *キー入力
2660 IF C=0 THEN GOSUB *画面クリア:GOTO *END
2670 IF C=8 THEN OUT &H22,&H40 '電源OFF
2680 IF C=9 THEN SYSTEM
2690 MN=C:P=0:GOTO *表示
2700 '********************************************************************
2710 *BGM
2720 IF P=0 AND C=0 THEN PLAY OFF: エラー=9:CD STOP:エラー=1:GOTO *キー入力
2730 LM$="ループ演奏しない。":RM$="ループ演奏する。"
2740 GOSUB *2択
2750 IF 曲=P*10+C THEN *演奏
2760 IF 曲>0 THEN ERASE 演奏
2770 エラー=6
2780 DIM 演奏(INT(FS&(P,C)/2))
2790 曲=P*10+C:エラー=2
2800 LOAD@ FILE$(0,P,C),演奏
2810 エラー=1
2820 *演奏
2830 IF X=48 THEN PLAY@ 演奏,0 ELSE PLAY@ 演奏,1
2840 PL=1:GOTO *復帰
2850 '********************************************************************
2860 *LOAD
2870 GOSUB *画面クリア:エラー=3:SHELL"cd "+DIR$:LOAD FILE$
2880 *RUN
2890 COLOR 0,,,4:GOSUB *C18
2900 色=15:GOSUB *LINE
2910 LOCATE 10,18:PRINT"※データ読込中※"
2920 LINE(80,342)-(206,358),PSET,%14,BF,%14
2930 エラー=4:SHELL"cd "+DIR$:RUN FILE$
2940 '********************************************************************
2950 *削除
2960 IF (MN=0 AND (C<2 OR 7<C)) OR (MN=1 AND P=0 AND C=0) THEN *キー入力
2970 LM$="削除する。":RM$="削除しない。"
2980 GOSUB *2択
2990 IF X=48 THEN
3000 IF MN THEN '*******メインメニューでない**********
3010 項目数(MN)=項目数(MN)-1
3020 IF P*10+C=項目数(MN) THEN '最後の項目
3030 P2=P:C2=C
3040 ELSE
3050 FOR I=P*10+C TO 項目数(MN)
3060 P = I \10:C = I MOD 10
3070 P2=(I+1)\10:C2=(I+1) MOD 10
3080 表示$(MN ,P,C)=表示$(MN ,P2,C2)
3090 FILE$(MN-1,P,C)=FILE$(MN-1,P2,C2)
3100 IF MN=1 THEN FS&(P,C)=FS&(P2,C2)
3110 NEXT
3120 ENDIF
3130 表示$(MN ,P2,C2)=""
3140 FILE$(MN-1,P2,C2)=""
3150 IF MN=1 THEN
3160 FS&(P2,C2)=0:K=P*10+C
3170 IF 曲=K THEN 曲=0:ERASE 演奏 ELSE IF 曲>K THEN 曲=曲-1
3180 ENDIF
3190 ELSE '*************メインメニューのとき**********
3200 IF C<MS THEN '最後の項目
3210 FOR I=C TO MS-1
3220 表示$(0,0,I)=表示$(0,0,I+1)
3230 題$(I) =題$(I+1)
3240 項目数(I) =項目数(I+1)
3250 FOR J=0 TO 9:FOR K=0 TO 9
3260 表示$(I ,J,K)=表示$(I+1,J,K)
3270 FILE$(I-1,J,K)=FILE$(I ,J,K)
3280 NEXT:NEXT
3290 NEXT
3300 ENDIF
3310 FOR J=0 TO 9:FOR K=0 TO 9
3320 表示$(MS,J,K)=""
3330 FILE$(MS,J,K)=""
3340 NEXT:NEXT
3350 表示$(0,0,MS)=""
3360 題$(MS)=""
3370 MS=MS-1
3380 ENDIF
3390 変更=1:GOSUB *表示3
3400 ENDIF
3410 GOTO *復帰
3420 '********************************************************************
3430 *セーブ
3440 LM$="ファイルに記録(セーブ)する。":RM$="記録(セーブ)しない。"
3450 GOSUB *2択
3460 IF X=48 THEN
3470 エラー=8:KILL"menu.dat"
3480 *回復
3490 エラー=5:OPEN "O",#1, "menu.dat"
3500 WRITE#1,MS
3510 FOR I=0 TO MS
3520 PRINT#1,題$(I)
3530 WRITE#1,項目数(I)
3540 P=0:項目数=項目数(I)
3550 WHILE 項目数>0
3560 FOR J=0 TO 9
3570 IF (I=0 AND (J<2 OR 7<J OR MS+1<J)) OR (I=1 AND P=0 AND J=0) OR J>=項目数 THEN *NEXT2
3580 PRINT#1,表示$(I,P,J)
3590 IF I>0 THEN PRINT#1,FILE$(I-1,P,J) 'メインメニューでない
3600 IF I=1 AND (P OR J) THEN WRITE#1,FS&(P,J) 'EUPメニューなら
3610 *NEXT2:NEXT J
3620 P=P+1:項目数=項目数-10
3630 WEND
3640 NEXT I
3650 CLOSE #1
3660 エラー=1:変更=0
3670 CALLM 0
3680 ENDIF
3690 GOTO *復帰
3700 '********************************************************************
3710 *編集
3720 IF (MN=0 AND (C<2 OR 7<C OR MS+1<C)) OR (MN=1 AND P=0 AND C=0) OR 項目数(MN)<P*10+C THEN *キー入力
3730 CONSOLE 0,24,2:COLOR 7,%0,,0:CLS
3740 CC=0:E_CR0=0:E_CR1=15
3750 GOSUB *INPUT1
3760 IF MN THEN
3770 GOSUB *INPUT3
3780 IF MN=1 THEN GOSUB *INPUT4
3790 ELSE 'メインメニュー(MN=0)
3800 GOSUB *INPUT2
3810 ENDIF
3820 '******変数に出力する******
3830 変更=1:表示$(MN,P,C)=入力$(0)
3840 IF MN=0 THEN 題$(C)=入力$(1) ELSE FILE$(MN-1,P,C)=入力$(1)
3850 IF MN=0 AND MS+1=C THEN MS=MS+1
3860 IF 項目数(MN)=P*10+C THEN 項目数(MN)=項目数(MN)+1
3870 GOTO *初期表示
3880 '************************************
3890 *INPUT1
3900 PRINT"項目名を入力してください。"
3910 E_X=0:E_Y=CSRLIN:E_字数=34
3920 E_文字$=表示$(MN,P,C)
3930 GOSUB *P255
3940 GOSUB *文字編集
3950 IF E_文字$="" THEN BEEP:GOSUB *ERR:GOTO *INPUT1
3960 入力$(0)=E_文字$
3970 RETURN
3980 '************************************
3990 *INPUT2
4000 PRINT"題名を入力してください。"
4010 E_X=0:E_Y=CSRLIN:E_字数=48
4020 E_文字$=題$(C)
4030 GOSUB *P255
4040 GOSUB *文字編集
4050 IF E_文字$="" THEN BEEP:GOSUB *ERR:GOTO *INPUT2
4060 入力$(1)=E_文字$
4070 RETURN
4080 '************************************
4090 *INPUT3
4100 PRINT"ファイル名を入力してください。"
4110 E_X=0:E_Y=CSRLIN:E_字数=255
4120 E_文字$=FILE$(MN-1,P,C)
4130 GOSUB *P255
4140 GOSUB *文字編集
4150 IF E_文字$="" THEN BEEP:GOSUB *ERR:GOTO *INPUT3
4160 入力$(1)=E_文字$
4170 RETURN
4180 '************************************
4190 *INPUT4
4200 PRINT"ファイルサイズを入力してください。(単位はbyte)"
4210 E_X=0:E_Y=CSRLIN:E_字数=20
4220 E_文字$=STR$(FS&(P,C))
4230 E_文字$=RIGHT$(E_文字$,LEN(E_文字$)-1)
4240 GOSUB *P255
4250 GOSUB *文字編集
4260 IF E_文字$="" THEN BEEP:GOSUB *ERR:GOTO *INPUT4
4270 エラー=7:FS&(P,C)=VAL(E_文字$)
4280 IF 曲=P*10+C THEN 曲=0:ERASE 演奏
4290 RETURN
4300 '************************************
4310 *P255:PRINT SPC(255):RETURN
4320 *ERR :LOCATE 0,E_Y-1:PRINT"もう一度";:RETURN
4330 '********************************************************************
4340 '★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
4350 '★ プログラム開発支援シリーズ第5弾 ★
4360 '★ 文字列編集サブルーチン TYPE B v1.02 ★
4370 '★ 94年10月14日(金) (C)渡辺 良一 ★
4380 '★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
4390 '
4400 '変数紹介(先頭の『E_』は省略)
4410 ' 文字$,M$ ……… 編集する文字列
4420 ' X,Y ……… 文字を表示する文字座標
4430 ' 字数 ……… 編集する文字の最大の長さ(半角計算)
4440 ' CR0 ……… 背景色
4450 ' CR1 ……… カーソルの色
4460 ' CR ……… カーソル移動時に使用
4470 ' L,M,N,X2,Y2 ……… 文字表示時に使用(L,M,Nは↓でも使用)
4480 ' X3,Y3,Z ……… カーソルを表示する時に使用
4490 ' C ……… カーソルの文字列中の位置(文字数で)
4500 ' I,I2 ……… カーソルを移動させる文字座標
4510 ' K$,K ……… 入力された文字とそのキャラクタコード
4520 '
4530 *文字編集
4540 CALLM 0
4550 GOSUB *E_文字表示
4560 E_X2=LEN(E_文字$):E_C=KLEN(E_文字$)
4570 GOSUB *E_表示
4580 *E_INKEY
4590 E_K$=INKEY$
4600 IF E_K$="" THEN *E_INKEY
4610 E_K=ASC(E_K$)
4620 ' ↓実行キー
4630 IF E_K=13 THEN GOSUB *E_消す:RETURN
4640 IF E_K=24 THEN GOSUB *E_消す:RETURN *初期表示
4650 ' ↑取消キー 復帰する場所を指定↑
4660 IF E_K=5 AND E_X2<LEN(E_文字$) THEN *E_一括削除
4670 IF E_K=8 AND E_C >0 THEN *E_後退
4680 IF E_K=127 THEN IF E_X2<E_字数 THEN *E_削除 ELSE *E_INKEY
4690 IF E_K=28 AND E_X2<LEN(E_文字$) THEN E_I= 1:GOTO *E_左右移動 '右
4700 IF E_K=29 AND E_C >0 THEN E_I=-1:GOTO *E_左右移動 '左
4710 IF E_K<32 THEN *E_INKEY '↓日本語文字なら次も入力する
4720 IF (127<E_K AND E_K<160) OR 223<E_K THEN E_K$=E_K$+INKEY$
4730 '**** 文字入力 *********
4740 IF LEN(E_文字$)+LEN(E_K$)>E_字数 THEN BEEP:CALLM 0:GOTO *E_INKEY
4750 E_文字$=KLEFT$(E_文字$,E_C)+E_K$+KMID$(E_文字$,E_C+1)
4760 E_I=1:E_I2=LEN(E_K$):GOSUB *E_文字表示:GOTO *E_移動
4770 '
4780 *E_一括削除
4790 E_文字$=KLEFT$(E_文字$,E_C)+STRING$(LEN(E_文字$)-E_X2,32)
4800 GOSUB *E_文字表示
4810 E_文字$=KLEFT$(E_文字$,E_C)
4820 GOTO *E_INKEY
4830 *E_後退
4840 IF KTYPE(E_文字$,E_C) THEN E_I2=-2 ELSE E_I2=-1
4850 E_M$=E_文字$:E_文字$=KLEFT$(E_M$,E_C-1)
4860 IF E_C<255 THEN E_文字$=E_文字$+KMID$(E_M$,E_C+1)
4870 GOSUB *E_文字表示:E_I=-1:GOTO *E_移動
4880 *E_削除
4890 E_M$=E_文字$:E_文字$=KLEFT$(E_M$,E_C)
4900 IF E_C<254 THEN E_文字$=E_文字$+KMID$(E_M$,E_C+2)
4910 GOSUB *E_文字表示
4920 GOTO *E_INKEY
4930 *E_左右移動 '↓右移動なら+1 ↓日本語文字ならば
4940 IF KTYPE(E_文字$,29-E_K +E_C) THEN E_I2=E_I*2 ELSE E_I2=E_I
4950 '************************
4960 *E_移動
4970 E_C=E_C+E_I
4980 GOSUB *E_消す
4990 E_CR=E_CR1:E_X2=E_X2+E_I2
5000 GOSUB *E_表示
5010 GOTO *E_INKEY
5020 *E_消す:E_CR=E_CR0:GOSUB *E_書く:RETURN 'カーソル消す
5030 *E_表示 '******カーソル表示******
5040 E_X3=E_X+E_X2:E_Y3=0:E_N=0:E_Z=0
5050 WHILE E_X3>79
5060 IF E_Y3=0 THEN E_L=E_X ELSE E_L=0
5070 E_M=ASC(MID$(E_文字$,80-E_L+E_Z,1))
5080 IF (127<E_M AND E_M<160) OR 223<E_M THEN
5090 E_M=ASC(MID$(E_文字$,79-E_L+E_Z,1))
5100 E_N=1:IF (127<E_M AND E_M<160) OR 223<E_M THEN E_N=0
5110 ENDIF
5120 E_Z=E_Z+80-E_N-E_L:E_X3=E_X3-80+E_N
5130 E_N=0:E_Y3=E_Y3+1
5140 WEND
5150 E_CR=E_CR1:GOSUB *E_書く
5160 RETURN
5170 *E_書く:LINE(E_X3*8,(E_Y+E_Y3)*19)-STEP(1,15),PSET,%E_CR,B:RETURN
5180 *E_文字表示
5190 E_M$=E_文字$:E_Y2=0
5200 IF LEN(E_M$)=0 THEN LOCATE E_X,E_Y:PRINT" ";" "
5210 WHILE LEN(E_M$)
5220 E_N=LEN(E_M$)
5230 IF E_Y2=0 THEN E_L=E_X ELSE E_L=0
5240 LOCATE E_L,E_Y+E_Y2
5250 IF LEN(E_M$)+E_L<=80 THEN
5260 PRINT E_M$;" ";" ":E_M$=""
5270 ELSE
5280 E_M=ASC(MID$(E_M$,80-E_L,1))
5290 IF (127<E_M AND E_M<160) OR 223<E_M THEN E_N=0 ELSE E_N=1
5300 E_M=ASC(MID$(E_M$,79-E_L,1))
5310 IF (127<E_M AND E_M<160) OR 223<E_M THEN E_N=1
5320 PRINT LEFT$(E_M$,79+E_N-E_L);
5330 IF E_N=0 THEN PRINT" "
5340 E_M$=MID$(E_M$,80+E_N-E_L)
5350 E_Y2=E_Y2+1
5360 ENDIF
5370 WEND
5380 RETURN
5390 '********************************************************************
5400 *2択
5410 COLOR 3,,,0:GOSUB *C18
5420 LOCATE 23-KLEN(LM$),18:PRINT LM$
5430 LOCATE 58-KLEN(RM$),18:PRINT RM$
5440 XX=X:YY=Y:X=48:Y=342 '現在のカーソルの位置を、XXとYYに記憶しておく
5450 色=13:GOSUB *LINE
5460 *キー入力3
5470 K$=INKEY$
5480 IF K$="" THEN *キー入力3
5490 IF K$=CHR$(13) THEN RETURN 'リターン(実行)キー
5500 IF K$=CHR$(24) THEN RETURN *復帰 '取消キー
5510 IF K$=CHR$(28) OR K$=CHR$(29) THEN 'カーソルの左右キー
5520 色=15:GOSUB *LINE
5530 IF X=48 THEN X=328 ELSE X=48
5540 色=13:GOSUB *LINE
5550 ENDIF
5560 GOTO *キー入力3
5570 *復帰
5580 色=15:GOSUB *LINE
5590 GOSUB *メッセージ
5600 X=XX:Y=YY 'カーソルの位置を変数に戻す
5610 IF PL THEN PL=0:MN=0:GOTO *表示 ELSE *キー入力
5620 ' ↑『BGMメニュー』から『メインメニュー』へ変わるならば
5630 '********************************************************************
5640 *表示3
5650 COLOR 2,,,0:I=0
5660 FOR YM=8 TO 16 STEP 2:LOCATE 6,YM:PRINT SPC(70):NEXT
5670 FOR YM=8 TO 16 STEP 2:FOR XM=6 TO 41 STEP 35
5680 LOCATE XM,YM:PRINT 表示$(MN,P,I):I=I+1
5690 NEXT:NEXT
5700 CALLM 0
5710 RETURN
5720 '********************************************************************
5730 *カーソル移動
5740 色=15:GOSUB *LINE '↓Cが2の倍数(0,2,4,6,8)だったら X=48
5750 IF C AND 1 THEN X=328 ELSE X=48
5760 Y=152+(C\2)*38
5770 色=13:GOSUB *LINE
5780 GOTO *キー入力
5790 '********************************************************************
5800 *メッセージ
5810 GOSUB *C18:COLOR 0,,,4
5820 LOCATE 17,18:PRINT"↑↓←→カーソル移動 リターンキー決定"
5830 RETURN
5840 '********************************************************************
5850 *ファイル書き込み
5860 IF VER=1 THEN A&=&H83E0 ELSE A&=&H8B30
5870 FILE$=FILE$+STRING$(12-LEN(FILE$),&H00)
5880 GOTO *文字書き込み
5890 *ウィンドウ書き込み
5900 IF VER=1 THEN A&=&H9754 ELSE A&=&H9EA4
5910 FILE$=FILE$+STRING$(12-LEN(FILE$),&H20)
5920 *文字書き込み 'メモリへの書き込み
5930 FOR I=0 TO 11
5940 POKE A&+I,ASC(MID$(FILE$,I+1,1))
5950 NEXT
5960 RETURN
5970 '
5980 '******* その他 *****************************************************
5990 *LINE:LINE(X,Y)-STEP(272,16),PSET,%色,BF,%色:RETURN
6000 *C18:LOCATE 0,18:PRINT SPC(80):RETURN '18行目の文字を消す
6010 *画面クリア:COLOR 7,%0,7,0:CLS:CONSOLE 0,24,2:RETURN
6020 *END:FOR K=1 TO 10:KEY K,"":NEXT
6030 IF VER=1 THEN POKE &H83E0,0,4:POKE &H83E4,0,4:POKE &H83E8,0,4
6040 IF VER=2 THEN POKE &H8B30,0,4:POKE &H8B34,0,4:POKE &H8B38,0,4
6050 IF VER THEN FILE$="PROGRAM":GOSUB *ウィンドウ書き込み
6060 CLEAR ,,512,FRE(4)/3,0,0
6070 END
6080 '
6090 '******** エラー処理ルーチン ****************************************
6100 *ERROR
6110 IF エラー=0 THEN
6120 CLOSE #1:MS=1
6130 項目数(0)=10:項目数(1)=1
6140 RESUME *環境初期化
6150 ENDIF
6160 IF エラー=8 THEN IF ERR=73 OR ERR=75 THEN エラー=5 ELSE RESUME *回復
6170 IF エラー=9 THEN エラー=1:RESUME *キー入力 'cdミス
6180 '++++その他のエラー++++++++++++++++++++++++
6190 ER$=STR$(ERR)
6200 ER$="エラー"+RIGHT$(ER$,LEN(ER$)-1)+"が発生しました。"
6210 BEEP:CALLM 0
6220 IF エラー=1 THEN
6230 GOSUB *画面クリア
6240 PRINT "予想外";ER$
6250 RESUME *END
6260 ELSE IF エラー=7 THEN
6270 GOSUB *ERR:RESUME *INPUT4
6280 ENDIF
6290 IF エラー=2 THEN ERASE 演奏:曲=0 'EUP読み込みのとき
6300 IF エラー<>3 THEN 'LOADでない
6310 LINE(33,342)-(606,358),PSET,%15,BF,%15
6320 GOSUB *C18:LOCATE 6,18:COLOR 1,,,0
6330 X=XX:Y=YY 'カーソルをもとの位置に戻す
6340 ENDIF
6350 IF エラー=5 THEN E$="書き込み中" ELSE E$="読み込み中"
6360 IF エラー=6 THEN
6370 ER$="EUPファイル演奏のためのメモリが足りません。"
6380 ELSE IF ERR=5 AND MN=1 THEN
6390 ER$="ファイルサイズが実際より小さく指定されています。"
6400 ELSE IF ERR=53 OR ERR=71 THEN
6410 ER$="ディスクに不良箇所があります。"
6420 ELSE IF ERR=55 OR ERR=63 THEN
6430 ER$="ファイルが見つかりません。"
6440 ELSE IF ERR=65 OR ERR=67 THEN
6450 ER$="ディスクに空き領域がありません。"
6460 ELSE IF ERR=72 THEN
6470 ER$="指定のドライブはアクセスできない状態にあります。"
6480 ELSE IF ERR=73 THEN
6490 ER$="ディスクの書き込みが禁止されています。"
6500 ELSE IF ERR=75 THEN
6510 ER$="アクセスが拒否されました。"
6520 ELSE
6530 ER$="ファイル"+E$+"に、"+ER$
6540 ENDIF
6550 PRINT ER$
6560 IF エラー=3 THEN 'LOADのとき
6570 PRINT"何かキーを押してください。"
6580 WHILE INKEY$="":WEND
6590 X=XX:Y=YY:CC=0 'カーソルをクリアしないようにする
6600 エラー=1:RESUME *初期表示
6610 ENDIF
6620 EM=1:エラー=1:RESUME *キー入力